package com.gem.day16;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**聊天室程序服务端*/
/*
 * 注意:服务端启动后会占用指定端口,所以当多次运行时会抛出端口被占用的异常:
 * java.net.BindException: Address already in use: NET_Bind
 */
public class TalkServer {
	//定义集合保存所有的客户端
	private List<Socket> clients;
	//定义端口
	private int port;

	//构造方法
	public TalkServer(int port) {
		this.port = port;
		this.clients = new ArrayList<>();
	}

	//服务端启动方法
	public void startServer() {
		System.out.println("聊天室程序启动...");
		//根据指定的端口创建服务端套接字对象
		try (ServerSocket serverSocket = new ServerSocket(port)) {
			System.out.println("服务器正在[" + port + "]端口运行中...");
			while (true) {
				//监听客户端的连接[阻塞方法],当客户端连接成功,则返回该客户端套接字对象
				Socket socket = serverSocket.accept();
				//把客户端对象放入到集合中
				clients.add(socket);
				//统计目前在线人数
				System.out.println("目前在线的人数有: " + clients.size());
				//得到IP地址
				System.out.println("\t新加入者的IP为: " + socket.getInetAddress());
				//创建服务线程
				new TalkThread(clients, socket).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new TalkServer(8888).startServer();
	}
}
